@@ -7,7 +7,7 @@ from jsonfield import JSONField  | 
            ||
| 7 | 7 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                from kodo.basemodels import LensmanTypeBoolMixin  | 
            
| 10 | 
                -from mch.models import SaleclerkInfo, MaintenancemanInfo  | 
            |
| 10 | 
                +from mch.models import MaintenancemanInfo, SaleclerkInfo  | 
            |
| 11 | 11 | 
                from sales.models import SalesResponsibilityInfo  | 
            
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                 | 
            
                @@ -475,7 +475,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 475 | 475 | 
                'shots_num': self.shots_num,  | 
            
| 476 | 476 | 
                'level': self.level,  | 
            
| 477 | 477 | 
                }  | 
            
| 478 | 
                -  | 
            |
| 478 | 
                +  | 
            |
| 479 | 479 | 
                def brand_qydata(self, brand_id=None):  | 
            
| 480 | 480 | 
                if self.phone:  | 
            
| 481 | 481 | 
                try:  | 
            
                @@ -485,12 +485,12 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):  | 
            ||
| 485 | 485 | 
                             saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
               | 
            
| 486 | 486 | 
                else:  | 
            
| 487 | 487 | 
                             saleclerk_info = {}
               | 
            
| 488 | 
                -  | 
            |
| 488 | 
                +  | 
            |
| 489 | 489 | 
                try:  | 
            
| 490 | 490 | 
                maintenance = MaintenancemanInfo.objects.get(brand_id=brand_id, user_id=self.user_id, status=True)  | 
            
| 491 | 
                - except:  | 
            |
| 491 | 
                + except MaintenancemanInfo.DoesNotExist:  | 
            |
| 492 | 492 | 
                             maintenance = {}
               | 
            
| 493 | 
                -  | 
            |
| 493 | 
                +  | 
            |
| 494 | 494 | 
                         maintenance_info = maintenance.data if maintenance and self.is_maintenance else {}
               | 
            
| 495 | 495 | 
                         return {
               | 
            
| 496 | 496 | 
                'has_unionid': bool(self.unionid),  | 
            
                @@ -2,27 +2,22 @@  | 
            ||
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from __future__ import division  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 
                -import json  | 
            |
| 6 | 5 | 
                from collections import defaultdict  | 
            
| 7 | 6 | 
                from datetime import datetime  | 
            
| 8 | 
                -from itertools import chain, groupby  | 
            |
| 9 | 7 | 
                 | 
            
| 10 | 8 | 
                from django.conf import settings  | 
            
| 11 | 9 | 
                from django.db import transaction  | 
            
| 12 | 
                -from django.db.models import Count, Sum, Q  | 
            |
| 10 | 
                +from django.db.models import Count, Q, Sum  | 
            |
| 13 | 11 | 
                from django_logit import logit  | 
            
| 14 | 12 | 
                from django_response import response  | 
            
| 15 | 13 | 
                from paginator import pagination  | 
            
| 16 | 14 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 17 | 
                -from django.utils.timezone import utc  | 
            |
| 18 | 15 | 
                 | 
            
| 19 | 16 | 
                from account.models import UserInfo  | 
            
| 20 | 
                -from integral.models import SaleclerkSubmitLogInfo  | 
            |
| 21 | 
                -from logs.models import MchInfoEncryptLogInfo  | 
            |
| 22 | 17 | 
                from coupon.models import UserCouponInfo  | 
            
| 23 | 
                -from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, ModelInfo, SaleclerkInfo  | 
            |
| 24 | 
                -from statistic.models import (ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo,  | 
            |
| 25 | 
                - ModelSaleStatisticInfo)  | 
            |
| 18 | 
                +from integral.models import SaleclerkSubmitLogInfo  | 
            |
| 19 | 
                +from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo  | 
            |
| 20 | 
                +from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo  | 
            |
| 26 | 21 | 
                from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode,  | 
            
| 27 | 22 | 
                ProductMachineStatusCode, UserStatusCode)  | 
            
| 28 | 23 | 
                 | 
            
                @@ -97,7 +92,7 @@ def usecoupon(request):  | 
            ||
| 97 | 92 | 
                model_id=model_id,  | 
            
| 98 | 93 | 
                serialNo=sn,  | 
            
| 99 | 94 | 
                submit_during_activity=True,  | 
            
| 100 | 
                - has_used=False,  | 
            |
| 95 | 
                + has_used=False,  | 
            |
| 101 | 96 | 
                status=True  | 
            
| 102 | 97 | 
                ).first()  | 
            
| 103 | 98 | 
                if not log:  | 
            
                @@ -168,6 +163,7 @@ def query_usercoupons(request):  | 
            ||
| 168 | 163 | 
                'coupons': coupons,  | 
            
| 169 | 164 | 
                })  | 
            
| 170 | 165 | 
                 | 
            
| 166 | 
                +  | 
            |
| 171 | 167 | 
                @logit  | 
            
| 172 | 168 | 
                def query_usergoods(request):  | 
            
| 173 | 169 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
                @@ -224,22 +220,22 @@ def query_userinfo(request):  | 
            ||
| 224 | 220 | 
                 | 
            
| 225 | 221 | 
                if level:  | 
            
| 226 | 222 | 
                userinfos = userinfos.filter(level=level)  | 
            
| 227 | 
                -  | 
            |
| 223 | 
                +  | 
            |
| 228 | 224 | 
                if code_version:  | 
            
| 229 | 225 | 
                userinfos = userinfos.filter(code_version=code_version)  | 
            
| 230 | 
                -  | 
            |
| 226 | 
                +  | 
            |
| 231 | 227 | 
                if subscribe:  | 
            
| 232 | 228 | 
                userinfos = userinfos.filter(subscribe=subscribe)  | 
            
| 233 | 
                -  | 
            |
| 229 | 
                +  | 
            |
| 234 | 230 | 
                if has_membercard:  | 
            
| 235 | 231 | 
                userinfos = userinfos.filter(has_membercard=has_membercard)  | 
            
| 236 | 
                -  | 
            |
| 232 | 
                +  | 
            |
| 237 | 233 | 
                if is_member:  | 
            
| 238 | 234 | 
                userinfos = userinfos.filter(level__gte=1)  | 
            
| 239 | 
                -  | 
            |
| 235 | 
                +  | 
            |
| 240 | 236 | 
                if sex:  | 
            
| 241 | 237 | 
                userinfos = userinfos.filter(sex=sex)  | 
            
| 242 | 
                -  | 
            |
| 238 | 
                +  | 
            |
| 243 | 239 | 
                if start_time and end_time:  | 
            
| 244 | 240 | 
                ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S')  | 
            
| 245 | 241 | 
                ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')  | 
            
                @@ -626,6 +622,7 @@ def statistic_consumer(request):  | 
            ||
| 626 | 622 | 
                'province_logs': province_logs,  | 
            
| 627 | 623 | 
                })  | 
            
| 628 | 624 | 
                 | 
            
| 625 | 
                +  | 
            |
| 629 | 626 | 
                def statistic_member(request):  | 
            
| 630 | 627 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 631 | 628 | 
                     admin_id = request.POST.get('admin_id', '')
               | 
            
                @@ -647,7 +644,7 @@ def statistic_member(request):  | 
            ||
| 647 | 644 | 
                 | 
            
| 648 | 645 | 
                for user in users:  | 
            
| 649 | 646 | 
                         userinfos |= UserInfo.objects.filter(user_id=user.get('user_id', ''))
               | 
            
| 650 | 
                -  | 
            |
| 647 | 
                +  | 
            |
| 651 | 648 | 
                # 会员级别  | 
            
| 652 | 649 | 
                     level_logs = list(userinfos.values('level').annotate(num=Count('user_id')))
               | 
            
| 653 | 650 | 
                 | 
            
                @@ -671,6 +668,7 @@ def statistic_member(request):  | 
            ||
| 671 | 668 | 
                'province_logs': province_logs,  | 
            
| 672 | 669 | 
                })  | 
            
| 673 | 670 | 
                 | 
            
| 671 | 
                +  | 
            |
| 674 | 672 | 
                def record_consumer(request):  | 
            
| 675 | 673 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 676 | 674 | 
                     page = request.POST.get('page', 1)
               | 
            
                @@ -689,15 +687,15 @@ def record_consumer(request):  | 
            ||
| 689 | 687 | 
                administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)  | 
            
| 690 | 688 | 
                except AdministratorInfo.DoesNotExist:  | 
            
| 691 | 689 | 
                return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)  | 
            
| 692 | 
                -  | 
            |
| 690 | 
                +  | 
            |
| 693 | 691 | 
                     logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & (Q(model_name__icontains=query) | Q(phone__icontains=query) | Q(serialNo__icontains=query))).order_by('-created_at')
               | 
            
| 694 | 692 | 
                 | 
            
| 695 | 693 | 
                if dupload:  | 
            
| 696 | 694 | 
                logs = logs.filter(dupload=dupload)  | 
            
| 697 | 
                -  | 
            |
| 695 | 
                +  | 
            |
| 698 | 696 | 
                if code_version:  | 
            
| 699 | 697 | 
                logs = logs.filter(code_version=code_version)  | 
            
| 700 | 
                -  | 
            |
| 698 | 
                +  | 
            |
| 701 | 699 | 
                if start_time and end_time:  | 
            
| 702 | 700 | 
                logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)  | 
            
| 703 | 701 | 
                 | 
            
                @@ -711,6 +709,7 @@ def record_consumer(request):  | 
            ||
| 711 | 709 | 
                'left': left  | 
            
| 712 | 710 | 
                })  | 
            
| 713 | 711 | 
                 | 
            
| 712 | 
                +  | 
            |
| 714 | 713 | 
                def record_sale(request):  | 
            
| 715 | 714 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 716 | 715 | 
                     admin_id = request.POST.get('admin_id', '')
               | 
            
                @@ -731,15 +730,15 @@ def record_sale(request):  | 
            ||
| 731 | 730 | 
                administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)  | 
            
| 732 | 731 | 
                except AdministratorInfo.DoesNotExist:  | 
            
| 733 | 732 | 
                return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)  | 
            
| 734 | 
                -  | 
            |
| 735 | 
                -    logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query)| Q(code__icontains=query))).order_by('-created_at')
               | 
            |
| 733 | 
                +  | 
            |
| 734 | 
                +    logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query) | Q(code__icontains=query))).order_by('-created_at')
               | 
            |
| 736 | 735 | 
                 | 
            
| 737 | 736 | 
                if dupload:  | 
            
| 738 | 737 | 
                logs = logs.filter(dupload=dupload)  | 
            
| 739 | 
                -  | 
            |
| 738 | 
                +  | 
            |
| 740 | 739 | 
                if code_version:  | 
            
| 741 | 740 | 
                logs = logs.filter(code_version=code_version)  | 
            
| 742 | 
                -  | 
            |
| 741 | 
                +  | 
            |
| 743 | 742 | 
                if has_scan:  | 
            
| 744 | 743 | 
                logs = logs.filter(has_scan=has_scan)  | 
            
| 745 | 744 | 
                 | 
            
                @@ -748,7 +747,6 @@ def record_sale(request):  | 
            ||
| 748 | 747 | 
                 | 
            
| 749 | 748 | 
                if is_online_sale:  | 
            
| 750 | 749 | 
                         logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else ''))
               | 
            
| 751 | 
                -  | 
            |
| 752 | 750 | 
                 | 
            
| 753 | 751 | 
                count = logs.count()  | 
            
| 754 | 752 | 
                logs, left = pagination(logs, page, num)  | 
            
                @@ -294,28 +294,33 @@ def consumer_info_api(request):  | 
            ||
| 294 | 294 | 
                for act in activities:  | 
            
| 295 | 295 | 
                try:  | 
            
| 296 | 296 | 
                coupon = CouponInfo.objects.get(coupon_id=act['coupon_id'])  | 
            
| 297 | 
                + except CouponInfo.DoesNotExist:  | 
            |
| 298 | 
                + continue  | 
            |
| 299 | 
                +  | 
            |
| 300 | 
                + try:  | 
            |
| 297 | 301 | 
                activity = ActivityInfo.objects.get(activity_id=act['activity_id'])  | 
            
| 298 | 
                - UserCouponInfo.objects.create(  | 
            |
| 299 | 
                - brand_id=coupon.brand_id,  | 
            |
| 300 | 
                - brand_name=coupon.brand_name,  | 
            |
| 301 | 
                - coupon_id=coupon.coupon_id,  | 
            |
| 302 | 
                - user_id=user_id,  | 
            |
| 303 | 
                - coupon_title=coupon.coupon_title,  | 
            |
| 304 | 
                - coupon_detail=coupon.coupon_detail,  | 
            |
| 305 | 
                - coupon_value=coupon.coupon_value,  | 
            |
| 306 | 
                - coupon_image=coupon.coupon_image,  | 
            |
| 307 | 
                - active_at=tc.utc_datetime(),  | 
            |
| 308 | 
                - expire_at=coupon.final_expire_at,  | 
            |
| 309 | 
                - is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff,  | 
            |
| 310 | 
                - coupon_valid_period=coupon.coupon_valid_period,  | 
            |
| 311 | 
                - coupon_limit_model_ids=coupon.coupon_limit_model_ids,  | 
            |
| 312 | 
                - coupon_from='PROMOTION',  | 
            |
| 313 | 
                - activity_id=activity.activity_id,  | 
            |
| 314 | 
                - activity_name=activity.activity_name,  | 
            |
| 315 | 
                - )  | 
            |
| 316 | 
                - except:  | 
            |
| 302 | 
                + except ActivityInfo.DoesNotExist:  | 
            |
| 317 | 303 | 
                continue  | 
            
| 318 | 304 | 
                 | 
            
| 305 | 
                + UserCouponInfo.objects.create(  | 
            |
| 306 | 
                + brand_id=coupon.brand_id,  | 
            |
| 307 | 
                + brand_name=coupon.brand_name,  | 
            |
| 308 | 
                + coupon_id=coupon.coupon_id,  | 
            |
| 309 | 
                + user_id=user_id,  | 
            |
| 310 | 
                + coupon_title=coupon.coupon_title,  | 
            |
| 311 | 
                + coupon_detail=coupon.coupon_detail,  | 
            |
| 312 | 
                + coupon_value=coupon.coupon_value,  | 
            |
| 313 | 
                + coupon_image=coupon.coupon_image,  | 
            |
| 314 | 
                + active_at=tc.utc_datetime(),  | 
            |
| 315 | 
                + expire_at=coupon.final_expire_at,  | 
            |
| 316 | 
                + is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff,  | 
            |
| 317 | 
                + coupon_valid_period=coupon.coupon_valid_period,  | 
            |
| 318 | 
                + coupon_limit_model_ids=coupon.coupon_limit_model_ids,  | 
            |
| 319 | 
                + coupon_from='PROMOTION',  | 
            |
| 320 | 
                + activity_id=activity.activity_id,  | 
            |
| 321 | 
                + activity_name=activity.activity_name,  | 
            |
| 322 | 
                + )  | 
            |
| 323 | 
                +  | 
            |
| 319 | 324 | 
                # 更新销售员提交的表  | 
            
| 320 | 325 | 
                SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk, status=True).update(has_scan=True)  | 
            
| 321 | 326 | 
                 | 
            
                @@ -13,7 +13,8 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui  | 
            ||
| 13 | 13 | 
                tourguidegroupuser_views)  | 
            
| 14 | 14 | 
                from group import views as group_views  | 
            
| 15 | 15 | 
                from message import views as message_views  | 
            
| 16 | 
                -from miniapp import views as mini_views, qy_views  | 
            |
| 16 | 
                +from miniapp import qy_views  | 
            |
| 17 | 
                +from miniapp import views as mini_views  | 
            |
| 17 | 18 | 
                from operation import views as op_views  | 
            
| 18 | 19 | 
                from page import oauth_views, sale_views, screen_views  | 
            
| 19 | 20 | 
                from pay import views as pay_views  | 
            
                @@ -187,7 +188,7 @@ urlpatterns += [  | 
            ||
| 187 | 188 | 
                 | 
            
| 188 | 189 | 
                url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'), # 小程序登录  | 
            
| 189 | 190 | 
                 | 
            
| 190 | 
                - url(r'^qy/query/userinfo$', qy_views.query_userinfo, name='query_userinfo'), # 查询用户等级及维修劵  | 
            |
| 191 | 
                + url(r'^qy/query/userinfo$', qy_views.query_userinfo, name='query_userinfo'), # 查询用户等级及维修劵  | 
            |
| 191 | 192 | 
                ]  | 
            
| 192 | 193 | 
                 | 
            
| 193 | 194 | 
                urlpatterns += [  | 
            
                @@ -6,9 +6,9 @@ import os  | 
            ||
| 6 | 6 | 
                from django_six import CompatibilityBaseCommand, close_old_connections  | 
            
| 7 | 7 | 
                 | 
            
| 8 | 8 | 
                from integral.models import SaleclerkSubmitLogInfo  | 
            
| 9 | 
                +from utils.qiniucdn import upload_file_path  | 
            |
| 9 | 10 | 
                from utils.redis.connect import r  | 
            
| 10 | 11 | 
                from utils.redis.rkeys import QINIU_UPLOAD_LIST  | 
            
| 11 | 
                -from utils.qiniucdn import upload_file_path  | 
            |
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                 logger = logging.getLogger('console')
               | 
            
                @@ -8,11 +8,11 @@ from django_redis_connector import connector  | 
            ||
| 8 | 8 | 
                from django_six import CompatibilityBaseCommand, close_old_connections  | 
            
| 9 | 9 | 
                from django_we.models import SubscribeUserInfo  | 
            
| 10 | 10 | 
                from pywe_storage import RedisStorage  | 
            
| 11 | 
                +from pywe_user import get_user_info  | 
            |
| 11 | 12 | 
                 | 
            
| 12 | 13 | 
                from account.models import UserInfo  | 
            
| 13 | 14 | 
                from mch.models import BrandInfo  | 
            
| 14 | 15 | 
                from pre.custom_message import sendcustomwxamessage  | 
            
| 15 | 
                -from pywe_user import get_user_info  | 
            |
| 16 | 16 | 
                from utils.redis.rkeys import SUBSCRIBE_USERINFO_LIST  | 
            
| 17 | 17 | 
                 | 
            
| 18 | 18 | 
                 | 
            
                @@ -118,7 +118,7 @@ class UserCouponInfo(BaseModelMixin):  | 
            ||
| 118 | 118 | 
                if not self.expire_at:  | 
            
| 119 | 119 | 
                return False  | 
            
| 120 | 120 | 
                return tc.utc_datetime() > self.expire_at  | 
            
| 121 | 
                -  | 
            |
| 121 | 
                +  | 
            |
| 122 | 122 | 
                @property  | 
            
| 123 | 123 | 
                def coupon_source(self):  | 
            
| 124 | 124 | 
                if self.coupon_from == 'INTEGRAL_MALL':  | 
            
                @@ -151,7 +151,7 @@ class UserCouponInfo(BaseModelMixin):  | 
            ||
| 151 | 151 | 
                'admin_id': self.admin_id,  | 
            
| 152 | 152 | 
                'used_at': self.used_at  | 
            
| 153 | 153 | 
                }  | 
            
| 154 | 
                -  | 
            |
| 154 | 
                +  | 
            |
| 155 | 155 | 
                @property  | 
            
| 156 | 156 | 
                def admindata(self):  | 
            
| 157 | 157 | 
                         return {
               | 
            
                @@ -2,7 +2,7 @@  | 
            ||
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from django.db import models  | 
            
| 4 | 4 | 
                from django.utils.translation import ugettext_lazy as _  | 
            
| 5 | 
                -from django_models_ext import BaseModelMixin, upload_path, upload_file_path, upload_file_url  | 
            |
| 5 | 
                +from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path  | 
            |
| 6 | 6 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 7 | 7 | 
                 | 
            
| 8 | 8 | 
                from mch.models import ModelInfo  | 
            
                @@ -129,7 +129,7 @@ class SaleclerkSubmitLogInfo(BaseModelMixin):  | 
            ||
| 129 | 129 | 
                 | 
            
| 130 | 130 | 
                def __unicode__(self):  | 
            
| 131 | 131 | 
                return unicode(self.pk)  | 
            
| 132 | 
                -  | 
            |
| 132 | 
                +  | 
            |
| 133 | 133 | 
                @property  | 
            
| 134 | 134 | 
                def image_path(self):  | 
            
| 135 | 135 | 
                return upload_file_path(self.image)  | 
            
                @@ -137,7 +137,7 @@ class SaleclerkSubmitLogInfo(BaseModelMixin):  | 
            ||
| 137 | 137 | 
                @property  | 
            
| 138 | 138 | 
                def image_url(self):  | 
            
| 139 | 139 | 
                return qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.image)  | 
            
| 140 | 
                -  | 
            |
| 140 | 
                +  | 
            |
| 141 | 141 | 
                @property  | 
            
| 142 | 142 | 
                def code_image_path(self):  | 
            
| 143 | 143 | 
                return upload_file_path(self.code_image)  | 
            
                @@ -164,4 +164,4 @@ class SaleclerkSubmitLogInfo(BaseModelMixin):  | 
            ||
| 164 | 164 | 
                'image': self.image_url,  | 
            
| 165 | 165 | 
                'code_image': self.code_image_url,  | 
            
| 166 | 166 | 
                'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d'),  | 
            
| 167 | 
                - }  | 
            |
| 167 | 
                + }  | 
            
                @@ -9,8 +9,8 @@ from django_models_ext import ProvinceShortModelMixin  | 
            ||
| 9 | 9 | 
                from pysnippets.strsnippets import strip  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, CameraModelInfo, ConsumeInfoSubmitLogInfo,  | 
            
| 12 | 
                - DistributorInfo, LatestAppInfo, LatestAppScreenInfo, ModelCameraBodyInfo, ModelInfo,  | 
            |
| 13 | 
                - OperatorInfo, SaleclerkInfo, MaintenancemanInfo)  | 
            |
| 12 | 
                + DistributorInfo, LatestAppInfo, LatestAppScreenInfo, MaintenancemanInfo, ModelCameraBodyInfo,  | 
            |
| 13 | 
                + ModelInfo, OperatorInfo, SaleclerkInfo)  | 
            |
| 14 | 14 | 
                from utils.redis.rshot import update_member_shot_data  | 
            
| 15 | 15 | 
                 | 
            
| 16 | 16 | 
                 | 
            
                @@ -161,6 +161,7 @@ class SaleclerkInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmi  | 
            ||
| 161 | 161 | 
                     search_fields = ('brand_id', 'brand_name', 'distributor_id', 'distributor_name', 'clerk_id', 'clerk_name', 'clerk_phone', 'unionid', 'openid')
               | 
            
| 162 | 162 | 
                     actions_exclude = ('delete_selected', )
               | 
            
| 163 | 163 | 
                 | 
            
| 164 | 
                +  | 
            |
| 164 | 165 | 
                class MaintenancemanInfoAdmin(AdvancedExportExcelModelAdmin, AdvancedActionsModelAdmin, admin.ModelAdmin):  | 
            
| 165 | 166 | 
                     list_display = ('brand_name', 'wx_userid', 'maintenance_id', 'maintenance_name', 'maintenance_phone', 'status', 'created_at', 'updated_at')
               | 
            
| 166 | 167 | 
                     search_fields = ('maintenance_id', 'maintenance_name', 'maintenance_phone')
               | 
            
                @@ -252,4 +253,4 @@ admin.site.register(LatestAppInfo, LatestAppInfoAdmin)  | 
            ||
| 252 | 253 | 
                admin.site.register(LatestAppScreenInfo, LatestAppScreenInfoAdmin)  | 
            
| 253 | 254 | 
                admin.site.register(ConsumeInfoSubmitLogInfo, ConsumeInfoSubmitLogInfoAdmin)  | 
            
| 254 | 255 | 
                admin.site.register(ActivityInfo, ActivityInfoAdmin)  | 
            
| 255 | 
                -admin.site.register(MaintenancemanInfo, MaintenancemanInfoAdmin)  | 
            |
| 256 | 
                +admin.site.register(MaintenancemanInfo, MaintenancemanInfoAdmin)  | 
            
                @@ -478,6 +478,7 @@ class SaleclerkInfo(BaseModelMixin, SexModelMixin):  | 
            ||
| 478 | 478 | 
                 | 
            
| 479 | 479 | 
                data = admindata  | 
            
| 480 | 480 | 
                 | 
            
| 481 | 
                +  | 
            |
| 481 | 482 | 
                class MaintenancemanInfo(BaseModelMixin, SexModelMixin):  | 
            
| 482 | 483 | 
                brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)  | 
            
| 483 | 484 | 
                brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')  | 
            
                @@ -503,12 +504,13 @@ class MaintenancemanInfo(BaseModelMixin, SexModelMixin):  | 
            ||
| 503 | 504 | 
                 | 
            
| 504 | 505 | 
                @property  | 
            
| 505 | 506 | 
                def data(self):  | 
            
| 506 | 
                -        return  {
               | 
            |
| 507 | 
                +        return {
               | 
            |
| 507 | 508 | 
                'maintenance_id': self.maintenance_id,  | 
            
| 508 | 509 | 
                'maintenance_name': self.maintenance_name,  | 
            
| 509 | 510 | 
                'maintenance_phone': self.maintenance_phone,  | 
            
| 510 | 511 | 
                }  | 
            
| 511 | 512 | 
                 | 
            
| 513 | 
                +  | 
            |
| 512 | 514 | 
                class BrandModelDistributorPriceInfo(BaseModelMixin):  | 
            
| 513 | 515 | 
                brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)  | 
            
| 514 | 516 | 
                brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')  | 
            
                @@ -729,7 +731,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):  | 
            ||
| 729 | 731 | 
                'code_version': self.code_version,  | 
            
| 730 | 732 | 
                'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d'),  | 
            
| 731 | 733 | 
                }  | 
            
| 732 | 
                -  | 
            |
| 734 | 
                +  | 
            |
| 733 | 735 | 
                @property  | 
            
| 734 | 736 | 
                def admindata(self):  | 
            
| 735 | 737 | 
                         return {
               | 
            
                @@ -219,7 +219,7 @@ class RightInfo(BaseModelMixin):  | 
            ||
| 219 | 219 | 
                'left_num': 3,  | 
            
| 220 | 220 | 
                'left_tip': 3,  | 
            
| 221 | 221 | 
                }  | 
            
| 222 | 
                -  | 
            |
| 222 | 
                +  | 
            |
| 223 | 223 | 
                def maintaindata(self, level):  | 
            
| 224 | 224 | 
                right_detail = ''  | 
            
| 225 | 225 | 
                if level == 1:  | 
            
                @@ -232,7 +232,7 @@ class RightInfo(BaseModelMixin):  | 
            ||
| 232 | 232 | 
                right_detail = self.level4 if self.level4 else ''  | 
            
| 233 | 233 | 
                elif level == 5:  | 
            
| 234 | 234 | 
                right_detail = self.level5 if self.level5 else ''  | 
            
| 235 | 
                -  | 
            |
| 235 | 
                +  | 
            |
| 236 | 236 | 
                return right_detail  | 
            
| 237 | 237 | 
                 | 
            
| 238 | 238 | 
                 | 
            
                @@ -1,9 +1,9 @@  | 
            ||
| 1 | 1 | 
                # -*- coding: utf-8 -*-  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 
                -import logging  | 
            |
| 4 | 
                -import requests  | 
            |
| 5 | 3 | 
                import json  | 
            
| 4 | 
                +import logging  | 
            |
| 6 | 5 | 
                 | 
            
| 6 | 
                +import requests  | 
            |
| 7 | 7 | 
                from django.conf import settings  | 
            
| 8 | 8 | 
                from django.db import transaction  | 
            
| 9 | 9 | 
                from django_curtail_uuid import CurtailUUID  | 
            
                @@ -16,14 +16,15 @@ from pywe_storage import RedisStorage  | 
            ||
| 16 | 16 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 17 | 17 | 
                 | 
            
| 18 | 18 | 
                from account.models import UserInfo  | 
            
| 19 | 
                -from mch.models import SaleclerkInfo, DistributorInfo, MaintenancemanInfo  | 
            |
| 20 | 
                -from statistic.models import RegisterStatisticInfo  | 
            |
| 21 | 
                -from member.models import RightInfo  | 
            |
| 22 | 19 | 
                from coupon.models import UserCouponInfo  | 
            
| 20 | 
                +from mch.models import DistributorInfo, MaintenancemanInfo, SaleclerkInfo  | 
            |
| 21 | 
                +from member.models import RightInfo  | 
            |
| 22 | 
                +from statistic.models import RegisterStatisticInfo  | 
            |
| 23 | 23 | 
                from utils.error.errno_utils import ProductBrandStatusCode, ProductDistributorStatusCode, UserStatusCode  | 
            
| 24 | 24 | 
                from utils.redis.connect import r  | 
            
| 25 | 25 | 
                from utils.redis.rprofile import set_profile_info  | 
            
| 26 | 26 | 
                 | 
            
| 27 | 
                +  | 
            |
| 27 | 28 | 
                WECHAT = settings.WECHAT  | 
            
| 28 | 29 | 
                 logger = logging.getLogger('logit')
               | 
            
| 29 | 30 | 
                 | 
            
                @@ -48,11 +49,11 @@ def qy_login_api(request):  | 
            ||
| 48 | 49 | 
                 | 
            
| 49 | 50 | 
                token = access_token(appid=appid, secret=secret, storage=RedisStorage(r))  | 
            
| 50 | 51 | 
                 | 
            
| 51 | 
                - userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token='+token+'&userid='+userid).text  | 
            |
| 52 | 
                + userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=' + token + '&userid=' + userid).text  | 
            |
| 52 | 53 | 
                userinfo = json.loads(userinfo)  | 
            
| 53 | 54 | 
                 | 
            
| 54 | 55 | 
                     mobile = userinfo.get('mobile', '')
               | 
            
| 55 | 
                -  | 
            |
| 56 | 
                +  | 
            |
| 56 | 57 | 
                # Get or Create User  | 
            
| 57 | 58 | 
                user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid)  | 
            
| 58 | 59 | 
                 | 
            
                @@ -83,14 +84,14 @@ def qy_login_api(request):  | 
            ||
| 83 | 84 | 
                     if 122 in userinfo.get('department', []):
               | 
            
| 84 | 85 | 
                maintenance, created = MaintenancemanInfo.objects.get_or_create(brand_id=brand_id, maintenance_phone=mobile, status=True)  | 
            
| 85 | 86 | 
                user.is_maintenance = True  | 
            
| 86 | 
                -  | 
            |
| 87 | 
                +  | 
            |
| 87 | 88 | 
                if created:  | 
            
| 88 | 89 | 
                             maintenance.maintenance_name = userinfo.get('name', '')
               | 
            
| 89 | 90 | 
                             maintenance.maintenance_sex = userinfo.get('gender', 0)
               | 
            
| 90 | 91 | 
                maintenance.maintenance_phone = mobile  | 
            
| 91 | 92 | 
                maintenance.user_id = user.user_id  | 
            
| 92 | 93 | 
                maintenance.wx_userid = userid  | 
            
| 93 | 
                - maintenance.save()  | 
            |
| 94 | 
                + maintenance.save()  | 
            |
| 94 | 95 | 
                else:  | 
            
| 95 | 96 | 
                user.is_maintenance = False  | 
            
| 96 | 97 | 
                # 销售员登录  | 
            
                @@ -99,9 +100,9 @@ def qy_login_api(request):  | 
            ||
| 99 | 100 | 
                if created:  | 
            
| 100 | 101 | 
                try:  | 
            
| 101 | 102 | 
                                 distributor = DistributorInfo.objects.get(department_id__in=userinfo.get('department', []))
               | 
            
| 102 | 
                - except:  | 
            |
| 103 | 
                + except DistributorInfo.DoesNotExist:  | 
            |
| 103 | 104 | 
                return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)  | 
            
| 104 | 
                -  | 
            |
| 105 | 
                +  | 
            |
| 105 | 106 | 
                saleclerk.brand_id = brand_id  | 
            
| 106 | 107 | 
                saleclerk.distributor_id = distributor.distributor_id  | 
            
| 107 | 108 | 
                saleclerk.distributor_name = distributor.distributor_name  | 
            
                @@ -113,7 +114,7 @@ def qy_login_api(request):  | 
            ||
| 113 | 114 | 
                saleclerk.user_status = SaleclerkInfo.ACTIVATED  | 
            
| 114 | 115 | 
                saleclerk.is_auth = True  | 
            
| 115 | 116 | 
                saleclerk.save()  | 
            
| 116 | 
                -  | 
            |
| 117 | 
                +  | 
            |
| 117 | 118 | 
                user.save()  | 
            
| 118 | 119 | 
                 | 
            
| 119 | 120 | 
                return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brand_qydata(brand_id=brand_id))  | 
            
                @@ -128,9 +129,9 @@ def query_userinfo(request):  | 
            ||
| 128 | 129 | 
                 | 
            
| 129 | 130 | 
                try:  | 
            
| 130 | 131 | 
                user = UserInfo.objects.get(memberusercardcode=memebercardcode, status=True)  | 
            
| 131 | 
                - except:  | 
            |
| 132 | 
                + except UserInfo.DoesNotExist:  | 
            |
| 132 | 133 | 
                return response(UserStatusCode.USER_NOT_FOUND)  | 
            
| 133 | 
                -  | 
            |
| 134 | 
                +  | 
            |
| 134 | 135 | 
                # 维修人工费  | 
            
| 135 | 136 | 
                right = RightInfo.objects.get(right_id='X457xEV8KVxHQiTvhA7Dtf')  | 
            
| 136 | 137 | 
                coupons = UserCouponInfo.objects.filter(user_id=user.user_id, has_used=False, status=True)  | 
            
                @@ -14,8 +14,8 @@ from pywe_storage import RedisStorage  | 
            ||
| 14 | 14 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 15 | 15 | 
                 | 
            
| 16 | 16 | 
                from account.models import UserInfo  | 
            
| 17 | 
                -from statistic.models import RegisterStatisticInfo  | 
            |
| 18 | 17 | 
                from mch.models import SaleclerkInfo  | 
            
| 18 | 
                +from statistic.models import RegisterStatisticInfo  | 
            |
| 19 | 19 | 
                from utils.error.errno_utils import ProductBrandStatusCode, UserStatusCode  | 
            
| 20 | 20 | 
                from utils.redis.connect import r  | 
            
| 21 | 21 | 
                from utils.redis.rprofile import set_profile_info  | 
            
                @@ -158,9 +158,10 @@ def mini_login_api(request):  | 
            ||
| 158 | 158 | 
                # 同步销售员手机号  | 
            
| 159 | 159 | 
                try:  | 
            
| 160 | 160 | 
                saleclerk = SaleclerkInfo.objects.get(unionid=unionid, is_auth=True, status=True)  | 
            
| 161 | 
                + except SaleclerkInfo.DoesNotExist:  | 
            |
| 162 | 
                + saleclerk = None  | 
            |
| 163 | 
                + if saleclerk:  | 
            |
| 161 | 164 | 
                user.phone = saleclerk.clerk_phone  | 
            
| 162 | 
                - except:  | 
            |
| 163 | 
                - pass  | 
            |
| 164 | 165 | 
                user.unionid = unionid  | 
            
| 165 | 166 | 
                user.user_status = UserInfo.ACTIVATED  | 
            
| 166 | 167 | 
                user.signup_ip = client_ip(request)  | 
            
                @@ -17,10 +17,11 @@ from account.models import UserInfo  | 
            ||
| 17 | 17 | 
                from coupon.models import UserCouponInfo  | 
            
| 18 | 18 | 
                from integral.models import SaleclerkIntegralIncomeExpensesInfo, SaleclerkSubmitLogInfo  | 
            
| 19 | 19 | 
                from logs.models import MchInfoEncryptLogInfo  | 
            
| 20 | 
                -from mch.models import BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo, SaleclerkInfo, MaintenancemanInfo  | 
            |
| 20 | 
                +from mch.models import (BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, MaintenancemanInfo, ModelInfo,  | 
            |
| 21 | 
                + SaleclerkInfo)  | 
            |
| 22 | 
                +from member.models import RightInfo  | 
            |
| 21 | 23 | 
                from statistic.models import (DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo,  | 
            
| 22 | 24 | 
                SaleclerkSaleStatisticInfo, SaleStatisticInfo)  | 
            
| 23 | 
                -from member.models import RightInfo  | 
            |
| 24 | 25 | 
                from utils.error.errno_utils import (CouponStatusCode, ProductBrandStatusCode, ProductDistributorStatusCode,  | 
            
| 25 | 26 | 
                ProductMachineStatusCode, ProductModelStatusCode, SaleclerkStatusCode)  | 
            
| 26 | 27 | 
                 | 
            
                @@ -454,19 +455,26 @@ def clerk_query_coupon(request):  | 
            ||
| 454 | 455 | 
                user_coupon = UserCouponInfo.objects.get(user_coupon_id=user_coupon_id)  | 
            
| 455 | 456 | 
                except UserCouponInfo.DoesNotExist:  | 
            
| 456 | 457 | 
                return response(CouponStatusCode.COUPON_NOT_FOUND)  | 
            
| 457 | 
                -  | 
            |
| 458 | 
                +  | 
            |
| 458 | 459 | 
                right_detail = ''  | 
            
| 459 | 460 | 
                if is_maintenance:  | 
            
| 460 | 461 | 
                try:  | 
            
| 461 | 
                - maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True)  | 
            |
| 462 | 
                -  | 
            |
| 463 | 
                - # 维修人工费  | 
            |
| 462 | 
                + maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True)  | 
            |
| 463 | 
                + except MaintenancemanInfo.DoesNotExist:  | 
            |
| 464 | 
                + return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在')  | 
            |
| 465 | 
                +  | 
            |
| 466 | 
                + # 维修人工费  | 
            |
| 467 | 
                + try:  | 
            |
| 464 | 468 | 
                right = RightInfo.objects.get(right_id='X457xEV8KVxHQiTvhA7Dtf')  | 
            
| 465 | 
                - member = UserInfo.objects.get(user_id=user_coupon.user_id)  | 
            |
| 469 | 
                + except RightInfo.DoesNotExist:  | 
            |
| 470 | 
                + return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在')  | 
            |
| 466 | 471 | 
                 | 
            
| 467 | 
                - right_detail = right.maintaindata(level=member.level)  | 
            |
| 468 | 
                - except:  | 
            |
| 472 | 
                + try:  | 
            |
| 473 | 
                + member = UserInfo.objects.get(user_id=user_coupon.user_id)  | 
            |
| 474 | 
                + except UserInfo.DoesNotExist:  | 
            |
| 469 | 475 | 
                return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在')  | 
            
| 476 | 
                +  | 
            |
| 477 | 
                + right_detail = right.maintaindata(level=member.level)  | 
            |
| 470 | 478 | 
                else:  | 
            
| 471 | 479 | 
                try:  | 
            
| 472 | 480 | 
                clerk = SaleclerkInfo.objects.get(brand_id=brand.brand_id, clerk_phone=user.phone, status=True)  | 
            
                @@ -503,40 +511,43 @@ def clerk_writeoff_coupon(request):  | 
            ||
| 503 | 511 | 
                brand = BrandInfo.objects.get(brand_id=brandID)  | 
            
| 504 | 512 | 
                except BrandInfo.DoesNotExist:  | 
            
| 505 | 513 | 
                return response(ProductBrandStatusCode.BRAND_NOT_FOUND)  | 
            
| 506 | 
                -  | 
            |
| 514 | 
                +  | 
            |
| 507 | 515 | 
                try:  | 
            
| 508 | 516 | 
                user_coupon = UserCouponInfo.objects.get(user_coupon_id=user_coupon_id)  | 
            
| 509 | 
                - if user_coupon.has_used:  | 
            |
| 510 | 
                - return response(CouponStatusCode.COUPON_HAS_USED)  | 
            |
| 511 | 
                - elif user_coupon.is_coupon_admin_writeoff and not is_maintenance:  | 
            |
| 512 | 
                - return response(CouponStatusCode.COUPON_PERMISSION_DENIED)  | 
            |
| 513 | 
                - elif user_coupon.has_expired:  | 
            |
| 514 | 
                - return response(CouponStatusCode.COUPON_EXPIRED)  | 
            |
| 515 | 517 | 
                except UserCouponInfo.DoesNotExist:  | 
            
| 516 | 518 | 
                return response(CouponStatusCode.COUPON_NOT_FOUND)  | 
            
| 517 | 
                -  | 
            |
| 519 | 
                +  | 
            |
| 520 | 
                + if user_coupon.has_used:  | 
            |
| 521 | 
                + return response(CouponStatusCode.COUPON_HAS_USED)  | 
            |
| 522 | 
                + elif user_coupon.is_coupon_admin_writeoff and not is_maintenance:  | 
            |
| 523 | 
                + return response(CouponStatusCode.COUPON_PERMISSION_DENIED)  | 
            |
| 524 | 
                + elif user_coupon.has_expired:  | 
            |
| 525 | 
                + return response(CouponStatusCode.COUPON_EXPIRED)  | 
            |
| 526 | 
                +  | 
            |
| 518 | 527 | 
                user_coupon.has_used = True  | 
            
| 519 | 528 | 
                user_coupon.used_at = tc.utc_datetime()  | 
            
| 520 | 529 | 
                 | 
            
| 521 | 530 | 
                if is_maintenance:  | 
            
| 522 | 531 | 
                try:  | 
            
| 523 | 
                - maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True)  | 
            |
| 524 | 
                - user_coupon.admin_id = maintenance.maintenance_id  | 
            |
| 525 | 
                - user_coupon.admin_name = maintenance.maintenance_name  | 
            |
| 526 | 
                - user_coupon.save()  | 
            |
| 527 | 
                - except:  | 
            |
| 532 | 
                + maintenance = MaintenancemanInfo.objects.get(brand_id=brand.brand_id, user_id=user.user_id, status=True)  | 
            |
| 533 | 
                + except MaintenancemanInfo.DoesNotExist:  | 
            |
| 528 | 534 | 
                return response(400001, 'MaintenancemanInfo Not Found', u'维修员不存在')  | 
            
| 535 | 
                +  | 
            |
| 536 | 
                + user_coupon.admin_id = maintenance.maintenance_id  | 
            |
| 537 | 
                + user_coupon.admin_name = maintenance.maintenance_name  | 
            |
| 538 | 
                + user_coupon.save()  | 
            |
| 529 | 539 | 
                else:  | 
            
| 530 | 540 | 
                try:  | 
            
| 531 | 541 | 
                clerk = SaleclerkInfo.objects.get(brand_id=brand.brand_id, clerk_phone=user.phone, status=True)  | 
            
| 532 | 
                - user_coupon.clerk_id = clerk.clerk_id  | 
            |
| 533 | 
                - user_coupon.clerk_name = clerk.clerk_name  | 
            |
| 534 | 
                - user_coupon.distributor_id = clerk.distributor_id  | 
            |
| 535 | 
                - user_coupon.distributor_name = clerk.distributor_name  | 
            |
| 536 | 
                - user_coupon.save()  | 
            |
| 537 | 542 | 
                except SaleclerkInfo.DoesNotExist:  | 
            
| 538 | 543 | 
                return response(SaleclerkStatusCode.CLERK_NOT_FOUND)  | 
            
| 539 | 544 | 
                 | 
            
| 545 | 
                + user_coupon.clerk_id = clerk.clerk_id  | 
            |
| 546 | 
                + user_coupon.clerk_name = clerk.clerk_name  | 
            |
| 547 | 
                + user_coupon.distributor_id = clerk.distributor_id  | 
            |
| 548 | 
                + user_coupon.distributor_name = clerk.distributor_name  | 
            |
| 549 | 
                + user_coupon.save()  | 
            |
| 550 | 
                +  | 
            |
| 540 | 551 | 
                return response(200, 'Write Off Coupon Success', u'劵核销成功')  | 
            
| 541 | 552 | 
                 | 
            
| 542 | 553 | 
                 | 
            
                @@ -3,8 +3,8 @@  | 
            ||
| 3 | 3 | 
                from django.conf import settings  | 
            
| 4 | 4 | 
                from django_redis_connector import connector  | 
            
| 5 | 5 | 
                from pywe_storage import RedisStorage  | 
            
| 6 | 
                -  | 
            |
| 7 | 6 | 
                from pywe_user import get_all_users  | 
            
| 7 | 
                +  | 
            |
| 8 | 8 | 
                from utils.redis.rkeys import SUBSCRIBE_USERINFO_LIST  | 
            
| 9 | 9 | 
                 | 
            
| 10 | 10 | 
                 |